
#ifndef __RING_QUEUE_H
#define __RING_QUEUE_H

/**
 * @file        queue.h
 * @author      XiaMi
 * @brief       基于网上开源项目做简单修改的环形队列，简单测试已做，可以使用
 *              开源地址： https://gitee.com/ming_home/ring-queue_embed.git 
 *                      
 * @version     0.1
 * @date        2024-08-19
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include <stdint.h>

typedef uint8_t  QueueDataType_t;   // 队列元素数据类型

typedef struct Queue_Handle_t{
    uint16_t head;                      //队列头指针
    uint16_t tail;                      //队列尾指针
    uint16_t buffer_length;             //队列缓存长度（初始化时赋值）
    QueueDataType_t * buffer;		              //队列缓存数组（初始化时赋值）
    uint16_t Watermark;     // 队列最大使用量
}Queue_Handle_t;

typedef enum
{
    QUEUE_OK = 0x00u,  // 队列OK
    QUEUE_ERROR,    // 队列错误
    QUEUE_BUSY,    // 队列忙
    QUEUE_TIMEOUT ,    // 队列超时
    QUEUE_OVERLOAD,    // 队列已满
    QUEUE_VOID    ,    // 队列已空
}Queue_StatusType_t;

extern void Queue_Init(Queue_Handle_t * hqueue, QueueDataType_t * buffer, uint16_t len);
extern void Queue_Clear(Queue_Handle_t * hqueue);
extern uint16_t Queue_Count(Queue_Handle_t * hqueue);
extern Queue_StatusType_t Queue_Push(Queue_Handle_t * hqueue, QueueDataType_t data);
extern uint16_t Queue_Push_Array(Queue_Handle_t * hqueue, QueueDataType_t * pdatas, uint16_t len);
extern Queue_StatusType_t Queue_Pop(Queue_Handle_t * hqueue, QueueDataType_t * pdata);
extern uint16_t Queue_Pop_Array(Queue_Handle_t * hqueue, QueueDataType_t * pdatas, uint16_t len); 
extern Queue_StatusType_t Queue_Peek(Queue_Handle_t * hqueue, QueueDataType_t * pdata);
extern uint16_t Queue_Peek_Array(Queue_Handle_t * hqueue, QueueDataType_t * pdatas, uint16_t len);

#endif

